/**
 * @file mg_cdoas.c
 * @author Charry_Le (530673764@qq.com)
 * @brief 子设备新风源文件
 * @version 0.1
 * @date 2024-02-17
 *
 * @copyright Moorgen Intelligent Technologies Copyright (c) 2024
 *
 */
#include "../mg_device.h"
#include "mg_cdoas.h"

STRUCT_CDOAS_VALU Cdoas;
STRUCT_CDOAS_VALU Cdoas_After_Occupy;
CDOAS_CONFIG Cdoas_Config;

// 获取新风支持的设置
ENUM_CDOAS_SUPPOT Get_Cdoas_Suppot(void)
{
    return (ENUM_CDOAS_SUPPOT)Cdoas_Config.byte.Suppot;
}
// 获取新风设置值
uint16_t Get_Cdoas_Set_Value(void)
{
    if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_CO2)
    {
        return Cdoas.CO2SetValu;
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_PM25)
    {
        return Cdoas.PM25SetValu;
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_HUM)
    {
        return Cdoas.HumSetValu;
    }
    else
    {
        return 0xFFFF;
    }
}
// 获取新风环境值
uint16_t Get_Cdoas_Current_Value(void)
{
    /*if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_CO2)
    {
        return Sensor.Current_CO2;
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_PM25)
    {
        return Sensor.Current_PM25;
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_HUM)
    {
        return Sensor.Current_Hum;
    }
    else*/
    {
        return 0xFFFF;
    }
}
// 模式是否支持
uint8_t Cdoas_Mode_Is_Support(ENUM_CDOAS_MODE Mode)
{
    return ((Cdoas_Config.byte.Mode_Suppot >> (Mode - 1)) & 0x01);
}
/**********************************************************************/
/******************************新风控制********************************/
/**********************************************************************/
// 新风开关控制
void Cdoas_Switch_Set(bool Switch)
{
    if (Cdoas.Switch == Switch)
        return;
    Cdoas.Switch = Switch;
}
// 新风设置值设置
void Cdoas_Value_Set(uint16_t SetValue)
{
    if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_CO2)
    {
        if (SetValue > DEV_SET_CO2_MAX)
            Cdoas.CO2SetValu = DEV_SET_CO2_MAX; // 设置值
        else
            Cdoas.CO2SetValu = SetValue; // 设置值
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_PM25)
    {
        if (SetValue > DEV_SET_PM25_MAX)
            Cdoas.PM25SetValu = DEV_SET_PM25_MAX; // 设置值
        else
            Cdoas.PM25SetValu = SetValue; // 设置值
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_HUM)
    {
        if (SetValue > DEV_SET_HUM_MAX)
            Cdoas.HumSetValu = DEV_SET_HUM_MAX; // 设置值
        else if (SetValue < DEV_SET_HUM_MIN)
            Cdoas.HumSetValu = DEV_SET_HUM_MIN; // 设置值
        else
            Cdoas.HumSetValu = SetValue; // 设置值
    }
}
// 新风设置值+
void Cdoas_Value_Add(void)
{
    if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_CO2) // CO2
    {
        if (Cdoas.CO2SetValu % CO2_GRADS != 0)
        {
            Cdoas.CO2SetValu = Cdoas.CO2SetValu - (Cdoas.CO2SetValu % CO2_GRADS);
        }
        if (Cdoas.CO2SetValu < DEV_SET_CO2_MAX)
        {
            Cdoas.CO2SetValu += CO2_GRADS;
            if (Cdoas.CO2SetValu > DEV_SET_CO2_MAX)
                Cdoas.CO2SetValu = DEV_SET_CO2_MAX;
        }
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_PM25) // PM2.5
    {
        if (Cdoas.PM25SetValu % PM25_GRADS != 0)
        {
            Cdoas.PM25SetValu = Cdoas.PM25SetValu - (Cdoas.PM25SetValu % PM25_GRADS);
        }
        if (Cdoas.PM25SetValu < DEV_SET_PM25_MAX)
        {
            Cdoas.PM25SetValu += PM25_GRADS;
            if (Cdoas.PM25SetValu > DEV_SET_PM25_MAX)
                Cdoas.PM25SetValu = DEV_SET_PM25_MAX;
        }
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_HUM) // Hum
    {
        if (Cdoas.HumSetValu % HUM_GRADS != 0)
        {
            Cdoas.HumSetValu = Cdoas.HumSetValu - (Cdoas.HumSetValu % HUM_GRADS);
        }
        if (Cdoas.HumSetValu < DEV_SET_HUM_MAX)
        {
            Cdoas.HumSetValu += HUM_GRADS;
            if (Cdoas.HumSetValu > DEV_SET_HUM_MAX)
                Cdoas.HumSetValu = DEV_SET_HUM_MAX;
        }
    }
}
// 新风设置值+
void Cdoas_Value_Sub(void)
{
    if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_CO2) // CO2
    {
        if ((Cdoas.CO2SetValu % CO2_GRADS) != 0)
        {
            Cdoas.CO2SetValu = Cdoas.CO2SetValu - (Cdoas.CO2SetValu % CO2_GRADS);
        }
        else if (Cdoas.CO2SetValu > DEV_SET_CO2_MIN)
        {
            if (Cdoas.CO2SetValu < CO2_GRADS)
                Cdoas.CO2SetValu = DEV_SET_CO2_MIN;
            else
                Cdoas.CO2SetValu -= CO2_GRADS;
        }
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_PM25) // PM2.5
    {
        if ((Cdoas.PM25SetValu % PM25_GRADS) != 0)
        {
            Cdoas.PM25SetValu = Cdoas.PM25SetValu - (Cdoas.PM25SetValu % PM25_GRADS);
        }
        else if (Cdoas.PM25SetValu > DEV_SET_PM25_MIN)
        {
            if (Cdoas.PM25SetValu < PM25_GRADS)
                Cdoas.PM25SetValu = DEV_SET_PM25_MIN;
            else
                Cdoas.PM25SetValu -= PM25_GRADS;
        }
    }
    else if (Cdoas_Config.byte.Suppot == CDOAS_SUPPOT_HUM) // Hum
    {
        if ((Cdoas.HumSetValu % HUM_GRADS) != 0)
        {
            Cdoas.HumSetValu = Cdoas.HumSetValu - (Cdoas.HumSetValu % HUM_GRADS);
        }
        else if (Cdoas.HumSetValu > DEV_SET_HUM_MIN)
        {
            if (Cdoas.HumSetValu < HUM_GRADS)
                Cdoas.HumSetValu = DEV_SET_HUM_MIN;
            else
                Cdoas.HumSetValu -= HUM_GRADS;
        }
    }
}
// 新风风速设置
void Cdoas_Fan_Set(ENUM_CDOAS_WIND_SPEED Speed)
{
    if (Speed > CDOAS_WIND_SPEED_HIGH)
        return;
    Cdoas.WindSpeed = Speed;
}
// 新风风速+
void Cdoas_Fan_Add(void)
{
    if (Cdoas.WindSpeed < CDOAS_WIND_SPEED_HIGH)
        Cdoas.WindSpeed++;
    else
        Cdoas.WindSpeed = CDOAS_WIND_SPEED_AUTO;
}
// 新风风速-
void Cdoas_Fan_Sub(void)
{
    if (Cdoas.WindSpeed <= CDOAS_WIND_SPEED_HIGH && Cdoas.WindSpeed > CDOAS_WIND_SPEED_AUTO)
        Cdoas.WindSpeed--;
    else
        Cdoas.WindSpeed = CDOAS_WIND_SPEED_HIGH;
}

// 新风模式设置
void Cdoas_Mode_Set(ENUM_CDOAS_MODE Mode)
{
    if (Mode > CDOAS_MODE_FRESH)
        return;
    if (Cdoas_Config.byte.Mode_Suppot == 0)
        Cdoas.Mode = CDOAS_MODE_NULL;
    if (!Cdoas_Mode_Is_Support(Mode))
        return;
    Cdoas.Mode = Mode;
}
// 新风模式切换(按键触发)
void Cdoas_Mode_Cut(void)
{
    ENUM_CDOAS_MODE temp = Cdoas.Mode;
    if (Cdoas_Config.byte.Mode_Suppot == 0)
    {
        Cdoas.Mode = CDOAS_MODE_NULL;
    }
    else
    {
        do
        {
            (temp == CDOAS_MODE_FRESH) ? temp = CDOAS_MODE_AUTO : temp++;
        } while (!Cdoas_Mode_Is_Support(temp));
        Cdoas.Mode = temp;
    }
}
